// 引入axios
import axios from 'axios'
import store from '@/store'
import { MessageBox, Message } from 'element-ui'
import { getToken } from '@/util/auth'
// 创建axios实例
const httpService = axios.create({
    // baseURL: "http://localhost:8081", // url前缀
    baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    withCredentials: true, // send cookies when cross-domain requests
    timeout: 10000 // 请求超时时间
});
console.log('axios.js VUE_APP_BASE_API:', process.env.VUE_APP_BASE_API)
// request拦截器
httpService.interceptors.request.use(
    config => {
        // config.headers['Content-Type'] = 'text/plain'
        // 根据条件加入token-安全携带
        if (store.getters.token) {
            // let each request carry token
            // ['X-Token'] is a custom headers key
            // please modify it according to the actual situation
            // config.headers['Authorization'] = 'Bearer ' + getToken()
            config.headers['Authorization'] = getToken()
        }
        // console.log('axios config', config)
        return config;
    },
    error => {
        // 请求错误处理
        Promise.reject(error)
        return;
    }
)

// respone拦截器
httpService.interceptors.response.use(
    response => {
        // 统一打印响应数据
        console.group("本次请求地址：" + response.config.url)
        console.log(response);
        console.groupEnd()
        // 统一处理状态
        const res = response.data;
        // console.log(1111, response)
        if (res.code != 1) { // 需自定义
            if ([201, 204, 202].indexOf(res.code) != -1) {
                console.log('失效', res)
                MessageBox.confirm('登录超时或认证失败，请重新登录', '重新登录', {
                    showClose: false,
                    distinguishCancelAndClose: true,
                    showCancelButton: false,
                    closeOnClickModal: false,
                    closeOnPressEscape: false,
                    confirmButtonText: '重新登录',
                    type: 'warning'
                }).then(() => {
                    store.dispatch('user/resetToken').then(() => {
                        location.reload()
                    })
                })
                return
            }
            // Message({
            //     message: res.msg ? res.msg : '未知错误',
            //     type: 'error',
            //     duration: 2 * 1000
            // })
            // 返回异常
            return Promise.reject({
                status: res.code,
                message: res.msg
            });
        } else {
            return response.data
        }
    },
    // 处理处理
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '错误请求';
                    break;
                case 401:
                    error.message = '未授权，请重新登录';
                    break;
                case 403:
                    error.message = '拒绝访问';
                    break;
                case 404:
                    error.message = '请求错误,未找到该资源';
                    break;
                case 405:
                    error.message = '请求方法未允许';
                    break;
                case 408:
                    error.message = '请求超时';
                    break;
                case 500:
                    error.message = '服务器端出错';
                    break;
                case 501:
                    error.message = '网络未实现';
                    break;
                case 502:
                    error.message = '网络错误';
                    break;
                case 503:
                    error.message = '服务不可用';
                    break;
                case 504:
                    error.message = '网络超时';
                    break;
                case 505:
                    error.message = 'http版本不支持该请求';
                    break;
                default:
                    error.message = `未知错误${error.response.status}`;
            }
        } else {
            error.message = "连接到服务器失败";
            location.reload();
        }
        console.log('error', error)
        Message({
            message: error.message ? error.message : error,
            type: 'error',
            duration: 2 * 1000
        })
        return Promise.reject(error);
    }
)

/*网络请求部分*/

/*
 *  get请求
 *  url:请求地址
 *  params:参数
 * */
export function get (url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'get',
            params: params
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}

/*
 *  post请求
 *  url:请求地址
 *  params:参数
 * */
export function post (url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'post',
            data: params
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}

/*
 *  文件上传
 *  url:请求地址
 *  params:参数
 * */
export function fileUpload (url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'post',
            data: params,
            headers: { 'Content-Type': 'multipart/form-data' }
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}
httpService.get = get
httpService.post = post
// export default {
//     get,
//     post,
//     fileUpload
// }
export default httpService